다음과 같은 초 단위 시간 목록이 있습니다. L = [0.10218048, 1.20851996, 1.46800021, 1.73429061, 2.71525848, 3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013, 6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247, 8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653] 두 번째 경계에서 시작하여 길이가 2 초인 각 창에 대해 2 초 창에 속하는 모든 시간의 목록을 출력하고 싶습니다. 따라서 위의 예에서는 다음과 같습니다. [0.10218048, 1.20851996, 1.46800021, 1.73429061] [1.20851996, 1.46800021, 1.73429061, 2.71525848] [2.71525848, 3.14781922, 3.63637958] [3.14781922, 3.63637958] [5.11147358, 5.97497864] [5.11147358, 5.97497864, 6.35469013, 6.80623747, 6.99571917] [6.35469013, 6.80623747, 6.99571917, 7.65215123, 7.86108352] [7.65215123, 7.86108352, 8.52988247, 8.83068894] [8.52988247, 8.83068894] [10.07690977] [10.07690977, 11.5386728] [11.5386728, 12.01214112, 12.13307653] [12.01214112, 12.13307653] 일반적으로 창 길이는 2와 다를 수 있습니다. 어떻게 할 수 있습니까?
2021-01-31 08:12:20
나는 당신이 "두 번째 경계에서 시작하여 2 초 길이의 각 창에 대해"를 기준으로 증가하고 겹치지 않는 것을 의미한다고 생각합니다. 2 초 간격의 경우 동일하지만 길이를 변경하고 싶기 때문에 1 초 겹침은 0-3, 2-5, 4-7이되지만 증분은 0-3, 1-4, 2-를 의미합니다. 5. 그러나 만일을 대비하여 둘 다에 대한 해결책을 찾는 것은 흥미로 웠습니다. L이 정렬되고 모든 요소가 양수이고 두 번째 간격이 모두 정수로 시작한다고 가정하면 다음 방법을 사용할 수 있습니다. 수입 수학 컬렉션에서 가져 오기 defaultdict L = [0.10218048, 1.20851996, 1.46800021, 1.73429061, 2.71525848, 3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013, 6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247, 8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653] my_ranges = defaultdict (목록) 간격 _ 폭 = 2 L에서 x의 경우 : upper_bound = math.ceil (x) lower_bound = upper_bound-간격 _ 폭 lower_bound = max (0, lower_bound) 범위 (하한값, 상한값)의 y에 대해 : my_ranges [y] .append (x) in sorted (my_ranges) : print (내 _ 범위 [a]) 빈 범위가 있는지보고 싶은지 모르겠습니다. 그러나 defaultdict는 원하는 경우 빈 범위도 인쇄합니다. "for a in sorted"대신 다음 줄을 사용하십시오. 범위 내 (min (my_ranges), max (my_ranges) + 1) : 0-3, 2-5, 4-7 범위를 원하면 다음과 같이 작동합니다. 수입 수학 컬렉션에서 가져 오기 defaultdict L = [0.10218048, 1.20851996, 1.46800021, 1.73429061, 2.71525848, 3.14781922, 3.63637958, 5.11147358, 5.97497864, 6.35469013, 6.80623747, 6.99571917, 7.65215123, 7.86108352, 8.52988247, 8.83068894, 10.07690977, 11.53867284, 12.01214112, 12.13307653] 간격 _ 폭 = 2 my_ranges_2 = defaultdict (목록) L에서 x의 경우 : 확실히 _in = (x // (interval_width-1)) * (interval_width-1) # x 아래의 interval_width의 가장 낮은 배수는 항상 #print ( "추가", x, "대상", 확실히 _in) my_ranges_2 [definitely_in] .append (x) if x= 0 : # 예를 들어 x가 2.3이고 0,3 2,5 등이 있다면 ...이 중복 된 경우를 잡아야합니다. 나는 창 길이가 정수라고 가정하고, 그렇지 않다면 숫자가 하나 이상의 배열에 들어갈 수 있기 때문에 우리는 할 일이 훨씬 더 많습니다. 아마도 우리는 (interval_width-1) 씩 증가하는 while 루프를 가질 수 있습니다. #print ( "++ 추가", x, "끝", 확실히 _in-간격 _ 너비 + 1) my_ranges_2 [definitely_in-interval_width + 1] .append (x) in sorted (my_ranges_2) : print (a, my_ranges_2 [a]) # print (my_ranges_2 [a]) 내가 잊은 몇 가지 세부 사항이 있다고 생각하지만 필요에 따라 interval_width를 조정하여 내 코드가 원하는 작업을 수행하는지 확인하고 정확히 필요한 것을 알려주십시오. | 제가 제안 할 수있는 가능한 솔루션은 어떤 의미에서 "효율적"입니다. 입력 데이터를 한 번만 반복하고 종속성이 없습니다. 물론 비용은 순수한 파이썬으로 작성되고 (더 최적화 된 코드가있을 수 있음) 반복을 방지하기 위해 더 많은 추적 변수를 도입한다는 것입니다 (따라서 비단뱀 적입니다). def slide_window (데이터, 기간, 시작 = 0, 겹침 = 1) : 결과 = [] data_idx = 0 result_idx = 0 상한 = 시작 + 기간 낮음 = 시작 next_lower = 위쪽-겹침 # 빈 내부 목록을 삽입 지점까지 채우고 삽입하는 내부 도우미 def pad_and_append (at) : len (result) <= at : result.append ([]) result [at] .append (data [data_idx]) # 입력 데이터를 반복 동안 data_idx a 인 경우 : x = l [0]) & (L = i) & (L